// 接口和类型限制只是在书写 ts 代码时帮助开发者在开发时进行语法校验的工具，并不会编译为 js 代码
// interface 和 type 相类似，但并不完全一致，首选使用 interface
interface Person1 {
  // readonly name: string;   // readonly 表示该属性为只读属性
  name: string;
  // ?表示这个属性可有可无
  age?: number;
  // 该行代码表示当强类型匹配时（以字面量形式传入参数），只要属性名为字符串类型，并且属性值为任意类型时都可以接受
  [propName: string]: any;
  say(): string;
}

// 接口继承，新接口要有老接口所有的东西，并且可以自己有新的东西
interface Teacher11 extends Person1 {
  teach(): string;
}

// 定义函数类型的接口
interface SayHi {
  (word: string): string;
}

const getPersonName = (person: Person1): void => {
  console.log(person.name);
};

const setPersonName = (person: Teacher11, name: string): void => {
  person.name = name;
};

const person = {
  name: "dell",
  sex: "male",
  say() {
    return "say hello";
  },
  teach() {
    return "teach";
  },
};

getPersonName(person);
setPersonName(person, "lee");

// 让 User1 类应用 Person1 接口（使用接口对类的属性进行约束）
class User1 implements Person1 {
  name = "dell";
  say() {
    return "hello";
  }
}

const say: SayHi = (word: string) => {
  return word;
};
